import { 
  reqOrderAddress,
  reqOrderInfo,
  reqBuyNowGoods,
  reqSubmitOrder,
  reqPrePayInfo,
  reqPayStatus} from "../../api/orderpay"
  // 获取应用实例
const app = getApp()
import {formatTime} from "../../utils/formatTime"
import Schema from "../../../miniprogram_npm/async-validator/index"
import {debounce} from "miniprogram-licia"
Page({
  data: {
    orderAddress:{},// 订单收货地址
    buyName: '', // 订购人姓名
    buyPhone: '', // 订购人手机号
    deliveryDate: '', // 期望送达日期
    blessing: '', // 祝福语
    show: false, // 期望送达日期弹框
    minDate: new Date().getTime(),
    currentDate: new Date().getTime(),
    orderInfo: {}, // 订单商品详情
  },
  // 提交订单按钮
  submitOrder: debounce(async function() {
    const {buyName,buyPhone,deliveryDate,blessing,orderAddress,orderInfo} = this.data
    //根据接口文档组织参数
    const params ={
      buyName,
      buyPhone,
      cartList:orderInfo.cartVoList,
      deliveryDate,
      remarks:blessing,
      userAddressId:orderAddress.id
    }
    // 参数验证
    const { valid }  = await this.validatorPerson(params)
    if(!valid) return
    const res=  await reqSubmitOrder(params)
    if(res.code === 200){
      // 在平台订单创建成功以后，需要将服务器、后端返回的订单编号挂载到页面实例上
      this.orderNo = res.data
      // 获取预付单信息、支付参数
      this.advancePay()

    }
  },500),
  // 获取预支付订单，支付参数
  async advancePay(){
    try {
        // 获取支付参数
      const payParams = await reqPrePayInfo(this.orderNo)
      if(payParams.code === 200){
        // console.log('支付惨胡',payParams)
        // 调用  wx.requestPayment 发起微信支付
        const payInfo = await wx.requestPayment(payParams.data)
         // 获取支付的结果
         if (payInfo.errMsg === 'requestPayment:ok') {
          // 查询支付的状态
          const payStatus = await reqPayStatus(this.orderNo)

          if (payStatus.code === 200) {
            wx.redirectTo({
              url: '/modules/orderPayModule/pages/order/list/list',
              success: () => {
                wx.toast({
                  title: '支付成功',
                  icon: 'success'
                })
              }
            })
          }
        }
      }
      
    } catch (error) {
      wx.toast({title:'支付失败，请联系客服',icon:'error'})
    }
  },
  // 对收货人、订购人信息进行验证
  validatorPerson(params) {
    // 验证订购人，是否只包含大小写字母、数字和中文字符
    const nameRegExp = '^[a-zA-Z\\d\\u4e00-\\u9fa5]+$'

    // 验证订购人手机号，是否符合中国大陆手机号码的格式
    const phoneReg = '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$'

    // 创建验证规则
    const rules = {
      userAddressId: {
        required: true,
        message: '请选择收货地址'
      },
      buyName: [
        { required: true, message: '请输入订购人姓名' },
        { pattern: nameRegExp, message: '订购人姓名不合法' }
      ],
      buyPhone: [
        { required: true, message: '请输入订购人手机号' },
        { pattern: phoneReg, message: '订购人手机号不合法' }
      ],
      deliveryDate: { required: true, message: '请选择送达日期' }
    }

    // 传入验证规则进行实例化
    const validator = new Schema(rules)

    // 调用实例方法对请求参数进行验证
    // 注意：我们希望将验证结果通过 Promise 的形式返回给函数的调用者
    return new Promise((resolve) => {
      validator.validate(params, (errors) => {
        if (errors) {
          // 如果验证失败，需要给用户进行提示
          wx.toast({ title: errors[0].message })
          // 如果属性值是 false，说明验证失败
          resolve({ valid: false })
        } else {
          // 如果属性值是 true，说明验证成功
          resolve({ valid: true })
        }
      })
    })
  },


  // 选择期望送达日期
  onShowDateTimerPopUp() {
    this.setData({
      show: true
    })
  },

  // 期望送达日期确定按钮
  onConfirmTimerPicker(event) {
    // console.log('时间选择器',event)
    //event.detail 获取的是时间戳，需要转换
    const deliveryDate = formatTime(new Date(event.detail))
    // console.log(' deliveryDate', deliveryDate)

    this.setData({
      show: false,
      deliveryDate:deliveryDate
    
    })

  },

  // 期望送达日期取消按钮 以及 关闭弹框时触发
  onCancelTimePicker() {
    this.setData({
      show: false,
      minDate: new Date().getTime(),
      currentDate: new Date().getTime()
    })
  },

  // 跳转到收货地址
  toAddress() {
    wx.navigateTo({
      url: '/modules/settingModule/pages/address/add/index'
    })
  },
  // 获取收货地址
  async getAddress(){
    // 判断全局address有无数据
    const addressId= app.globalData.address.id
    if(addressId){
      this.setData({orderAddress:app.globalData.address})
      return
    }
    //全局没有数据，调用接口获取数据
    const { data: orderAddress } = await reqOrderAddress()
    this.setData({orderAddress})
    
  },
 // 获取订单详情数据
 async getOrderInfo() {
  const { goodsId, blessing } = this.data

  const { data: orderInfo } = goodsId
    ? await reqBuyNowGoods({ goodsId, blessing })
    : await reqOrderInfo()

  // 判断是否存在祝福语
  // 如果需要购买的是多个商品，筛选第一个存在祝福语的商品进行赋值
  const orderGoods = orderInfo.cartVoList.find((item) => item.blessing !== '')
  //没找到 orderGoods 为undefined

  this.setData({
    orderInfo,
    blessing: !orderGoods ? '' : orderGoods.blessing
  })
},
  // 在页面展示的时候进行触发
  onShow() {
    // 获取收货地址
    this.getAddress()

    // 获取需要下单商品的详细信息
    this.getOrderInfo()
  },
  //页面加载的时候触发
  onLoad(options){
    // console.log('结算页面',options)    
    this.setData({
      ...options
    })
    // if(options.goodsId){
    //   //立即购买进入的支付页面
    //   const {goodsId, blessing} = options
    //   this.setData({
    //     goodsId, blessing
    //   })
    // }
  },
  // 页面销毁后
  onUnload(){
    // 在页面销毁以后，需要将全局共享的 address 也进行重置
    // 如果用户再次进入结算支付页面，需要从接口地址获取默认的收货地址进行渲染
    // 需要和产品多沟通
    app.globalData.address = {}
  },

})
